package com.atguigu.study.controller;

import cn.hutool.core.date.DateUtil;
import com.atguigu.study.entities.LawPrompt;
import com.atguigu.study.service.ChatAssistant;
import com.atguigu.study.service.LawAssistant;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.Map;

/**
 * @author Marco
 * @Description
 * @date 2025/8/21 1:13
 * @email 3293336923@qq.com
 */
@Slf4j
@RestController
public class ChatPromptController {

    @Autowired
    private LawAssistant lawAssistant;

    @Autowired
    private ChatModel  chatModel;


//案例1
    @GetMapping("/chat/prompt/test01")
    public String prompt1() {
        String answer01 = lawAssistant.chat("什么是知识产权", 2000);
        log.info("answer01:{}", answer01);

        String answer02 = lawAssistant.chat("腱鞘炎是什么?", 2000);
        log.info("answer02:{}", answer02);

        String answer03 = lawAssistant.chat("介绍下西瓜和芒果", 2000);
        log.info("answer03:{}", answer03);

        String answer04 = lawAssistant.chat("飞机发动机原理", 2000);
        log.info("answer04:{}", answer04);

        return "success:" + DateUtil.now() +  "<br>" +
                "\n\n answer01:" + answer01 + "<br>" +
                "\n\n answer02: " + answer02;
    }


//  案例2：
    @GetMapping("chat/prompt/test02")
    public    String    prompt2(){
        LawPrompt   lawPrompt =  new LawPrompt();
        lawPrompt.setLegal("知识产权");
        lawPrompt.setQuestion("盗取上市公司的后台代码，有什么后果");
        String prompt = lawAssistant.prompt(lawPrompt);
        log.info("prompt:{}",prompt);

        return
                "success :" + DateUtil.now() +"<br> \n\n chat: "+ prompt;
    }
//   案例3
    @GetMapping("/chat/prompt/test03")
    public     String     prompt3(){

//        角色
        String   role = "牙科医生";
//       提示词
        String   question = "医生，我牙疼";

//        1、构造 模版 对象
        PromptTemplate promptTemplate = PromptTemplate.from("你是一个{{role}} 助手,请问 {{question}}怎么办");
//        2、通过  PromptTemplate , 给 提示词模版 填充参数 ，生成 Prompt对象
        Prompt prompt = promptTemplate.apply(Map.of("role", role, "question", question));
//        3、Prompt 提示词 变为 UserMessage
        UserMessage userMessage = prompt.toUserMessage();
//        4、调用 大模型 -- 使用 底层的 api
        ChatResponse chatResponse = chatModel.chat(userMessage);
//        5、返回的结果
        String result = chatResponse.aiMessage().text();
//        5.1、后台日志打印
            log.info("result:{}" , result);

//        5.2、前台响应
        return   "success" + DateUtil.now() + "<br> \n\n chat: " + result;
    }






//    TODO  ,  结合 流失输出 , 返回给 前台 ， 更好的 用户体验
    @Autowired
    private ChatAssistant  chatAssistant;

    @GetMapping("/chat/prompt/test04")
    public Flux<String> prompt4() {


//        角色
        String   role = "牙科医生";
//       提示词
        String   question = "医生，我牙疼";

//       1、构造 模版 对象
        PromptTemplate promptTemplate = PromptTemplate.from("你是一个{{role}} 助手,请问 {{question}}怎么办");
//        2、通过  PromptTemplate , 给 提示词模版 填充参数 ，生成 Prompt对象
        Prompt prompt = promptTemplate.apply(Map.of("role", role, "question", question));

        //        3、Prompt 提示词 变为 UserMessage
        UserMessage userMessage = prompt.toUserMessage();
//        4、调用 大模型 -- 使用 底层的 api
        ChatResponse chatResponse = chatModel.chat(userMessage);
//        5、返回的结果
        String result = chatResponse.aiMessage().text();
//        5.1、后台日志打印
        log.info("result:{}" , result);


//        5.2、前台打印 , 流式 返回
        return chatAssistant.chatFlux(result);

    }
}
